#include<iostream>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<netinet/in.h>
#include<arpa/inet.h>
 using namespace std;

// class TcpServer
// {
// private:
//     int _sockfd;
//     int _port;


// public:
//     void Init()
//     {
//         //创建套接字
//         _sockfd = socket(AF_INET, SOCK_STREAM, 0);
//         if(_sockfd < 0)
//         {
//             cout << "socket error" << endl;
//             exit(2);
//         }

//         //绑定
//         struct sockaddr_in local;
//         memset(&local, 0, sizeof(local));
//         local.sin_family = AF_INET;
//         local.sin_port = htons(_port);
//         local.sin_addr.s_addr = INADDR_ANY;
//         if(bind(_sockfd, (struct sockaddr*)&local, sizeof(sockaddr))< 0)
//         {
//             cout << "bind error" << endl;
//             exit(3);
//         }


//         //设置监听状态
//         if(listen(_sockfd, 5) < 0)
//         {
//             cout << "listen error" << endl;
//             exit(4);
//         }
//     }

//     void Start()
//     {
//         for(;;)
//         {
//             struct sockaddr_in peer;
//             memset(&peer, 0, sizeof(peer));
//             socklen_t len = sizeof(peer);
//             int sock = accept(_sockfd, (struct sockaddr*)&peer, &len);
//             if(sock < 0)
//             {
//                 cout << "accept error" << endl;
//                 continue;//不要断开
//             }
//             string client_ip = inet_ntoa(peer.sin_addr);
//             int client_port = ntohs(peer.sin_port);
//             cout << "get a new link" << sock << "new port is" << client_port << std::endl;
//         }
//     }


//     TcpServer(int port)
//     :_sockfd(-1),
//     _port(port)
//     {}

//     ~TcpServer()
//     {
//         if(_sockfd > 0)
//         {
//             close(_sockfd);
//         }
//     }
// };

// // void Service(int sock)
// // {
// //     char buff[1024];
// //     while(true)
// //     {
// //         ssize_t size = read(sock, buff, sizoef(buff) - 1);
// //         if(size > 0)
// //         {
// //             buff[size] = 0;
// //             write(sock, buff, size);
// //         }
// //         else if(size == 0)
// //         {
// //             close(sock);
// //             cout << "read cloes" << endl;
// //             break;
// //         }
// //         else
// //         {
// //             cout << "error : " << errno << endl;
// //             braek;
// //         }
// //     }
// // }

// void Usgae(string proc)
// {
//     std::cout << "Usage: " << proc<<"port"<<std::endl;
// }

// int main(int argc, char* argv[])
// {
//     if(argc != 2)
//     {
//         std::cerr << "Usage: " << argv[0] << "port" << std::endl;
//         return 1;
//     }

//     int port = atoi(argv[1]);
//     TcpServer* ser = new TcpServer(port);
//     ser->Init();
//     ser->Start();
//     return 0;
// }

// // int main()
// // {
// //     cout << "1111111111" << endl;
// //     return 0;
// // }


//////////////////////以上是无效内容

class TcpClient
{
public:
    TcpClient(string server_ip, int server_port)
    :_sock(-1)
    ,_server_ip(server_ip)
    ,_server_port(server_port)
    {}

    ~TcpClient()
    {
        if(_sock >= 0) close(_sock);
    }

    void InitClient()
    {
        //创建套接字
        _sock = socket(AF_INET, SOCK_STREAM, 0);
        if(_sock < 0){
            cerr << "socket error" << endl;
            exit(2);
        }
    }

    void Start()
    {
        struct sockaddr_in peer;
        memset(&peer, '\0', sizeof(peer));
        peer.sin_family = AF_INET;
        peer.sin_port = htons(_server_port);
        peer.sin_addr.s_addr = inet_addr(_server_ip.c_str());

        if(connect(_sock, (struct sockaddr*)&peer, sizeof(peer)) == 0)
        {
            //连接成功
            cout<<"connect success..." << std::endl;
            Request();//发送请求
        }
        else{
            cerr << "connect failed..."<< endl;
            exit(3);
        }
    }

    void Request()
    {
        string msg;
        char buffer[1024];
        while(1)
        {
            cout << "189" << endl;
            cout << "Please Enter# ";
            getline(cin, msg);

            cout << "193" << endl;

            write(_sock, msg.c_str(), msg.size());

            cout << "198" << endl;
            cin.ignore();
            ssize_t size = read(_sock, buffer, sizeof(buffer)-1);
            cout << 199 << endl;
            if(size > 0)
            {
                buffer[size] = '\0';
                cout << 203 << endl;
                cout << "server echo# " << buffer << std::endl;
            }
            else if(size == 0)
            {
                cout << "server close!" <<endl;
                break;
            }
            else{
                cerr << "read error! " << endl;
                break;
            }
        }
    }
private:
    int _sock;//套接字
    string _server_ip;//服务器IP地址
    int _server_port;//服务器端口号
};

void Usage(string proc)
{
    cout << "Usage: " << proc << "server_ip server_port" << endl;
}

int main(int argc, char* argv[])
{
    if(argc != 3)
    {
        Usage(argv[0]);
        exit(1);
    }

    string server_ip = argv[1];
    int server_port = atoi(argv[2]);
    TcpClient* clt = new TcpClient(server_ip, server_port);
    clt->InitClient();
    clt->Start();
    return 0;
}
